package com.sumainfor.common.util;

import com.alibaba.fastjson.JSONObject;
import com.sumainfor.common.config.RedisUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.SecureRandom;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 唐巢&果加智能门锁
 * 果加智能门锁工具类
 * @ClassName: InteGuoJiaUtil
 * @author xzzhao
 * @date 2019年3月11日
 */
public class InteGuoJiaUtil {
    static Logger  log = LoggerFactory.getLogger(InteGuoJiaUtil.class);// 日志
    /**
     * 加密
     * @param datasource byte[]
     * @param password String
     * @return byte[]
     */
    public static byte[] encrypt(byte[] datasource, String password) {
        try{
            SecureRandom random = new SecureRandom();
            DESKeySpec desKey = new DESKeySpec(password.getBytes());
//创建一个密匙工厂，然后用它把DESKeySpec转换成
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey securekey = keyFactory.generateSecret(desKey);
//Cipher对象实际完成加密操作
            Cipher cipher = Cipher.getInstance("DES");
//用密匙初始化Cipher对象
            cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
//现在，获取数据并加密
//正式执行加密操作
            return cipher.doFinal(datasource);
        }catch(Throwable e){
            e.printStackTrace();
        }
        return null;
    }
    public static String bytesToHexString(byte[] src){
             StringBuilder stringBuilder = new StringBuilder("");
             if (src == null || src.length <= 0) {
                     return null;
                 }
             for (int i = 0; i < src.length; i++) {
                     int v = src[i] & 0xFF;
                     String hv = Integer.toHexString(v);
                     if (hv.length() < 2) {
                             stringBuilder.append(0);
                         }
                     stringBuilder.append(hv);
                 }
             return stringBuilder.toString();
         }

    /**
     *获取业务流水单号
     */
    public static String getSid () {
        return UUID.randomUUID().toString().replace("-", "");
    }
    /**
     *登陆获取token
     * @return
     */
    public static Map<String,Object> login(Map<String,Object> params, JSONObject bodyJson) {
        // 装配请求参数
        String url=InteGuoJiaConfig.HOST+"/login";
        //发送请求
        Map<String,Object> map=HttpUtilBee.doPost(url,params,bodyJson);
        log.info(map.toString());
        return map;
    }
    /**
     *发送一次性密码一次性密码有效期为两小时、并且两小时有效期内最多只能用一次。在两小时内，
     * 蓝牙锁最多获取 20 个，即只有 20 个密码同时可用；二代协议 433 门锁最多 8 个。
     * @return
     */
    public static Map<String,Object> temp_pwd(Map<String,Object> params, JSONObject bodyJson) {
        // 装配请求参数
        String url=InteGuoJiaConfig.HOST+"/pwd/temp_pwd";
        //发送请求
        Map<String,Object> map=HttpUtilBee.doPost(url,params,bodyJson);
        log.info(map.toString());
        return map;
    }
    /**
     *查询运营商的锁列表，锁的信息只包含基本信息，需要更多锁信息可以请求查询
     * 门锁详情接口
     * @return
     */
    public static Map<String,Object> loclList(Map<String,Object> params, JSONObject bodyJson) {
        // 装配请求参数
        String url=InteGuoJiaConfig.HOST+"/lock/list";
        //发送请求
        Map<String,Object> map=HttpUtilBee.doPost(url,params,bodyJson);
        log.info(map.toString());
        return map;
    }
    /**
     *通过授权，控制用户通过果加客户端管理门锁
     * @return
     */
    public static Map<String,Object> lockAuth(Map<String,Object> params, JSONObject bodyJson) {
        // 装配请求参数
        String url=InteGuoJiaConfig.HOST+"/lock/auth";
        //发送请求
        Map<String,Object> map=HttpUtilBee.doPost(url,params,bodyJson);
        log.info(map.toString());
        return map;
    }
    /**
     *通过解除授权，取消用户通过果加客户端管理门锁
     * @return
     */
    public static Map<String,Object> lockCancel_auth(Map<String,Object> params, JSONObject bodyJson) {
        // 装配请求参数
        String url=InteGuoJiaConfig.HOST+"/lock/cancel_auth";
        //发送请求
        Map<String,Object> map=HttpUtilBee.doPost(url,params,bodyJson);
        log.info(map.toString());
        return map;
    }

    /**
     * 新增自定义密码
     * @param bytes
     * @param radix
     * @return
     */
    public static Map<String,Object> pwd_add(Map<String,Object> params, JSONObject bodyJson){

        // 装配请求参数
        String url=InteGuoJiaConfig.HOST+"/pwd/add";
        //发送请求
        Map<String,Object> map=HttpUtilBee.doPost(url,params,bodyJson);
        log.info(map.toString());
        return map;
    }



    /**
     * 修改自定义密码
     * @param bytes
     * @param radix
     * @return
     */
    public static Map<String,Object> pwd_update(Map<String,Object> params, JSONObject bodyJson){

        // 装配请求参数
        String url=InteGuoJiaConfig.HOST+"/pwd/update";
        //发送请求
        Map<String,Object> map=HttpUtilBee.doPost(url,params,bodyJson);
        log.info(map.toString());
        return map;
    }



    /**
     * 删除自定义密码
     * @param bytes
     * @param radix
     * @return
     */
    public static Map<String,Object> pwd_delete(Map<String,Object> params, JSONObject bodyJson){

        // 装配请求参数
        String url=InteGuoJiaConfig.HOST+"/pwd/delete";
        //发送请求
        Map<String,Object> map=HttpUtilBee.doPost(url,params,bodyJson);
        log.info(map.toString());
        return map;
    }

    /**
     * 新增离线时效密码
     * @param params
     * @param bodyJson
     * @return
     */
    public static Map<String,Object> pwd_offlineadd(Map<String,Object> params,JSONObject bodyJson){
        // 装配请求参数
        String url=InteGuoJiaConfig.HOST+"/pwd/offline_add";
        //发送请求
        Map<String,Object> map=HttpUtilBee.doPost(url,params,bodyJson);
        log.info(map.toString());
        return map;
    }








    public static String binary(byte[] bytes, int radix){
        return new BigInteger(1, bytes).toString(radix);// 这里的1代表正数
    }
    public static void main(String[] args) {
        /*登陆获取token*/
//        Map<String,Object> params=new HashMap<String, Object>();
//        params.put("s_id",InteGuoJiaUtil.getSid());
//        params.put("version","1");
//        JSONObject bodyJson=new JSONObject();
//        //key
//        DESEncrypt desPlus2 = new DESEncrypt(InteGuoJiaConfig.DES_KEY);
//        //密码
//        String e2 = desPlus2.encrypt(InteGuoJiaConfig.PASSWORD);
//        bodyJson.put("account",InteGuoJiaConfig.ACCOUNT);
//        bodyJson.put("password",e2);
//        InteGuoJiaUtil.login(params,bodyJson);
//        String key="nSxWjxxL";
//        String password="00wcd574";
//        byte[] a=key.getBytes();
//        byte[] b=password.getBytes();
//        String  aa=InteGuoJiaUtil.bytesToHexString(InteGuoJiaUtil.encrypt(a,password));
//        String  bb=InteGuoJiaUtil.bytesToHexString(InteGuoJiaUtil.encrypt(b,key));
//        System.out.println("aa长度:"+InteGuoJiaUtil.encrypt(a,password).length);
//        System.out.println("bb长度:"+InteGuoJiaUtil.encrypt(a,key).length);
//        System.out.println("aa:"+InteGuoJiaUtil.binary(InteGuoJiaUtil.encrypt(a,password),32));
//        System.out.println("bb:"+InteGuoJiaUtil.binary(InteGuoJiaUtil.encrypt(b,key),32));
            //des加密
//        String key = "nSxWjxxL";
//        String str = "wcd574";
//        System.out.println("key:" + key);
//        DESEncrypt desPlus2 = new DESEncrypt(key);
//        String e2 = desPlus2.encrypt(str);
//        System.out.println("密文:" + e2);
        /*发送一次性密码*/
//        Map<String,Object> params=new HashMap<String, Object>();
//        params.put("s_id",InteGuoJiaUtil.getSid());
//        params.put("version","1");
//        params.put("access_token","138aa3a2270074ca11701a2d8d5b9c07c53c967c44a6fea289cffcf46ec7aed9");
//        JSONObject bodyJson=new JSONObject();
//        bodyJson.put("lock_no","21.1.8.224");
//        bodyJson.put("pwd_user_mobile","13020100801");
//        System.out.println(InteGuoJiaUtil.temp_pwd(params,bodyJson));
        /*获取门锁列表*/
//        Map<String,Object> params=new HashMap<String, Object>();
//        params.put("s_id",InteGuoJiaUtil.getSid());
//        params.put("version","1");
//        params.put("access_token","6634b1c6acb3a7bfdd042f18354dc858db768f3febdc57e6bf883174c5983d41");
//        JSONObject bodyJson=new JSONObject();
//        bodyJson.put("page_size","1");
//        bodyJson.put("current_page","1");
//        System.out.println(InteGuoJiaUtil.loclList(params,bodyJson));

//        System.out.println("字符串转成时间:"+DateUtils.stringToDate("2019-07-06 12:00","yyyy-MM-dd HH:mm"));
//        System.out.println("获取几个月之后的时间:"+DateUtils.addDateMonths( DateUtils.stringToDate("2019-07-06 12:00","yyyy-MM-dd HH:mm"),2));
//        System.out.println("格式化几个月之后的时间:"+DateUtils.format(DateUtils.addDateMonths( DateUtils.stringToDate("2019-07-06 12:00","yyyy-MM-dd HH:mm"),2)));
//        System.out.println(InteDeviceLockUtil.getTimeSign("2019-07-06 12:00","yyyy-MM-dd HH:mm:ss"));
        /*发送果加的门锁钥匙*/
//        Map<String,Object> params=new HashMap<String, Object>();
//        params.put("s_id",InteGuoJiaUtil.getSid());
//        params.put("version","1");
//        params.put("access_token","6634b1c6acb3a7bfdd042f18354dc858db768f3febdc57e6bf883174c5983d41");
//        JSONObject bodyJson=new JSONObject();
//        bodyJson.put("operate_pwd_auth","N");//是否允许操作密码 Y 允许 N 不允许
//        bodyJson.put("set_custom_pwd","N");//是否允许设置自定义密码 Y 允许 N 不允许智能是否允许设置自定义密码 Y 允许 N 不允许
//        bodyJson.put("lock_no","21.1.8.224");//智能门锁的设备编号
//        bodyJson.put("mobile","15703928772");//用户手机号
//        bodyJson.put("auth_time_start","1562584237000");//有效期开始时间
//        bodyJson.put("auth_time_end","1562584597000");//有效期结束时间
//        System.out.println(InteGuoJiaUtil.lockAuth(params,bodyJson));
        /*解除对用户的门锁授权*/
//        Map<String,Object> params=new HashMap<String, Object>();
//        params.put("s_id",InteGuoJiaUtil.getSid());
//        params.put("version","1");
//        params.put("access_token","6634b1c6acb3a7bfdd042f18354dc858db768f3febdc57e6bf883174c5983d41");
//        JSONObject bodyJson=new JSONObject();
//        bodyJson.put("lock_no","21.1.8.224");//智能门锁的设备编号
//        bodyJson.put("mobile","15703928772");//用户手机号
//        System.out.println(InteGuoJiaUtil.lockCancel_auth(params,bodyJson));

    }
}